
// 860.柠檬水找零

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        // 采用泰兴的方法来解决 , 在找零的时候优先使用面值大的零钱
        unordered_map<int,int> money({{5 , 0} , {10 , 0} , {20 , 0}});
        int n = bills.size();

        function<bool(int)> check = [&](int num)
        {
            int change = num - 5;
            if(change >= 10 && money[10]) change -= 10 , money[10]-- ;      // 先用10块的找
            if(change >= 5 && money[5] >= change/5)                         // 再用5块的找
            {
                money[5] -= change/5;
                change = 0;
            }
            money[num]++;
            if(change == 0) return true;
            return false;
        };

        for(int i = 0 ; i < n ; i++)
            if(!check(bills[i])) return false;
        return true;
    }
};